package com.education.platform.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.education.platform.entity.Message;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 消息Mapper接口
 *
 * @author education-platform
 * @since 2024-10-07
 */
@Mapper
public interface MessageMapper extends BaseMapper<Message> {

    /**
     * 分页查询消息列表（带用户信息）
     */
    IPage<Message> selectMessagePageWithUser(Page<Message> page, @Param("userId") Long userId, 
                                           @Param("conversationId") String conversationId,
                                           @Param("type") String type, @Param("status") String status);

    /**
     * 查询会话消息列表
     */
    List<Message> selectByConversationId(@Param("conversationId") String conversationId, 
                                       @Param("limit") Integer limit);

    /**
     * 查询用户未读消息
     */
    List<Message> selectUnreadMessages(@Param("userId") Long userId);

    /**
     * 统计用户未读消息数量
     */
    Integer countUnreadMessages(@Param("userId") Long userId);

    /**
     * 统计会话未读消息数量
     */
    Integer countUnreadByConversation(@Param("conversationId") String conversationId, 
                                    @Param("userId") Long userId);

    /**
     * 批量标记消息为已读
     */
    void batchMarkAsRead(@Param("messageIds") List<Long> messageIds, @Param("userId") Long userId);

    /**
     * 标记会话消息为已读
     */
    void markConversationAsRead(@Param("conversationId") String conversationId, 
                              @Param("userId") Long userId);

    /**
     * 查询系统消息
     */
    List<Message> selectSystemMessages(@Param("userId") Long userId, @Param("limit") Integer limit);

    /**
     * 查询最近聊天用户
     */
    List<Message> selectRecentChatUsers(@Param("userId") Long userId, @Param("limit") Integer limit);

    /**
     * 删除过期消息
     */
    void deleteExpiredMessages(@Param("beforeDate") LocalDateTime beforeDate);
}
